<?php
/* Clase encargada de gestionar las conexiones a la base de datos */
class Db{

	private $servidor;
	private $usuario;
	private $password;
	private $base_datos;
	private $link;
	private $stmt;
	private $array;
	private $numRowsLast;
	private $isTransaction = false;
	protected $interval = 300;  // 5 minutes interval 
	protected $visitors = 0;  // online visitors
	protected $hits = 0;  // online impressions
	protected $tiempoMinimo = 30; //tiempo minimo entre accion y accion para control de actividad
	
	static $_instance;
	
	/*La funci�n construct es privada para evitar que el objeto pueda ser creado mediante new*/
	private function __construct(){  
		$this->setWarningsOff();    
		$this->setConexion();
		$this->conectar();
	}

    /* uso php_ini para sacar losmensajes de error */
    private function setWarningsOff(){
        ini_set('display_errors',false);
        ini_set('error_reporting',0);
    }
	
	/*M�todo para establecer los par�metros de la conexi�n*/
	private function setConexion(){
		$conf = Conf::getInstance();
		$this->servidor=$conf->getHostDB();
		$this->base_datos=$conf->getDB();
		$this->usuario=$conf->getUserDB();
		$this->password=$conf->getPassDB();
	}
	
	/*Evitamos el clonaje del objeto. Patr�n Singleton*/
	private function __clone(){ }
	
	/*Funci�n encargada de crear, si es necesario, el objeto. Esta es la funci�n que debemos llamar desde fuera de la clase para instanciar el objeto, y as�, poder utilizar sus m�todos*/
	public static function getInstance(){        
		if (!(self::$_instance instanceof self)){
			self::$_instance=new self();
		}
		return self::$_instance;
	}

	/*Realiza la conexiopn a la base de datos.*/
	private function conectar(){
		$this->link=mysql_connect($this->servidor, $this->usuario, $this->password);
		mysql_select_db($this->base_datos,$this->link);
		@mysql_query("SET NAMES 'utf8'");
	}
	
	
	public function eje($sql){	
		$this->stmt=mysql_query($sql,$this->link);						
		if (mysql_errno($this->link) != 0){ //existe un codigo de error
			$this->logu("ERROR (execute query: ".mysql_errno($this->link).")",$sql);
			throw new Exception("Error de ejecucion [".mysql_errno($this->link)."] de sentencia SQL. [SQL: $sql]");
		}
		return $this->stmt; //retorno igual porque puede ser que una busqueda no devuelva datos, pero logueo para despues analizar.				
	}

	public function beginTransaction(){
		$this->eje("SET AUTOCOMMIT=0;");
		$this->eje("START TRANSACTION;");
		$this->isTransaction = true;
	}

	public function commit(){
		$this->eje("COMMIT;");
		$this->isTransaction = false;
	}
	
	public function rollback(){
		$this->eje("ROLLBACK;");
		$this->isTransaction = false;
	}
	
	private function puedeEjecutarAccion(){
		//uso $tiempoMinimo
		return true;
	}
	
	
	public function logu($desc,$texto){
		return false;
		if ($_SERVER['SERVER_NAME'] == 'localhost'){
			if (is_file("D:\AppServ\www\logs\logSQL.log")){
				$ddf = fopen("D:\AppServ\www\logs\logSQL.log","a");
			}else{
				$ddf = fopen("C:\AppServ\www\logs\logSQL.log","a");
			}
		}else{
			$ddf = fopen("/www/kalender.com.ar/htdocs/logs/logSQL.log","a");
		}
		fwrite($ddf,"[".date("r")."] Log > $desc: $texto \r\n");
		fclose($ddf);
	}
	
	public function log_alerta($desc,$texto){ 
		if ($_SERVER['SERVER_NAME'] == 'localhost'){
			if (is_file("D:\AppServ\www\kalender\logs\log_alerta.log")){
				$ddf = fopen("D:\AppServ\www\kalender\logs\log_alerta.log","a");
			}else{
				$ddf = fopen("C:\AppServ\www\kalender\logs\log_alerta.log","a");
			}
		}else{			
			$ddf = fopen("/www/kalender.com.ar/htdocs/logs/log_alerta.log","a");
		}
		fwrite($ddf,"[".date("r")."] Log > $desc: $texto \r\n");
		fclose($ddf);
	}
	
	/*Metodo que analiza la sentencia sql para la ejecucion*/
	public function san($var){
		$var = strip_tags(trim($var));	
		if (strrpos($var, 'drop table')){
			$this->logu("ERROR (sanity param)",$var);
			return false;
		}
		$var = nl2br($var);		
		$var = htmlspecialchars($var);
		return $var;
	}

	/*Metodo que verifica que un id de usuario sea correcto*/
	public function isActiveUser($var){		
		$res = $this->eje("select id from usuarios where id = ".$var);
		if ($this->numRows($res)==1){return "TRUE";}
		else{return "FALSE";}		
	}
	
	
	/*Metodo para obtener una fila de resultados de la sentencia sql*/
	public function fila($stmt,$fila=0){
		if ($this->numRows($stmt)>0) {			
			if ($fila==0){
				$this->array=mysql_fetch_array($stmt);
			}else{
				mysql_data_seek($stmt,$fila);
				$this->array=mysql_fetch_array($stmt);
			}
			return $this->array;
		}
	}
	
	//Devuelve el ultimo id del insert introducido
	public function lastID(){
		return mysql_insert_id($this->link);
	}

	//devuelve la cantidad de lineas de un resultset
	public function numRows($stmt){			
		return @mysql_num_rows($stmt);
	}
	
	
	public function changeEngine(){
		$sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine <> 'InnoDB'";
	    $rs = $this->eje($sql);
	
	    while($row = mysql_fetch_array($rs))
	    {
	        $tbl = $row[0];
	        $sql = "ALTER TABLE $tbl ENGINE=INNODB";
	        $this->eje($sql);
	    }
	}
	

	//////////////////////////////////////////////// los metodos de contador de usuarios online ///////////////////////////////////////
	/**
	 * Function that deletes all entries that older than the $interval value. 
	 * Returns a boolean value base on the success of the deletion.
	 *
	 * @param none
	 * @return integer $id
	 */
	private function clean(){		
	    $query = "DELETE FROM `visitors` WHERE time < DATE_SUB(NOW(), INTERVAL $this->interval SECOND);";
		$stmt=$this->eje($query);		
		return $stmt;
	}
	
	
	private function getrow($identificador_usuario){
		$query = "SELECT `ip`,`hits` FROM `visitors` WHERE user_id = $identificador_usuario;";		
		$stmt=$this->eje($query);
		return $this->fila($stmt,0);
	}
}
$_SESSION["DBObject"]=true;
mb_internal_encoding('UTF-8');
?>